/*
    HTTP服务器中的定时器
    它是用来干嘛的呢？
    Keep-Alive保活机制
    具体来说就是如果超过某一时间限制，服务器会将某client-fd从epoll的监听事件中删除，并关闭连接。
    从而如果客户端再次请求时，需要重写建立TCP连接。 
 */

#ifndef TIMER_HPP_
#define TIMER_HPP_

#include <sys/time.h>
#include "Common.hpp"
#include "HTTP_Request.hpp"

//class HTTP_Request; // 出现了头文件互相包含的原因

using std::priority_queue;

class Timer{
private:
    size_t expire_time;     // 超时时间（创建时间 + 时间限制）
    bool deleted;           // 标记是否被删除
    HTTP_Request *request; 

public:
    Timer(size_t et = 0, HTTP_Request* _req = nullptr) : \
         expire_time(et), deleted(false), request(_req) {} 
    bool operator < (const Timer &t){
        return expire_time < t.expire_time;
    }
    void del_timer(){
        deleted = true;
    }
    bool is_deleted(){
        return deleted;
    }
    size_t get_expire_time(){
        return expire_time;
    }
    void close_connection(){
        request->close_connection();
        delete request;
    }
};

class Timer_Queue{
private:
    size_t current_msec;
    priority_queue<Timer*> timer_queue;

public:
    void init_timer_queue();         // 初始化定时队列
    void update_time();             // 获取当前时间
    void add_timer(HTTP_Request *_req);               // 增加timer
    void handle_expire_timers();    // 处理已经超时的timer
    void delete_timer(HTTP_Request* _req);
    int find_timer();
};

#endif